#ifndef MEMALLOC_H
#define	MEMALLOC_H

#include <cstdlib>
#include <iostream>


int ma_init(size_t mem, uint64_t swap, const char* swap_path);
/*
ma_init() èíèöèàëèçèðóåò àëîêàòîð ïàìÿòè ñî ñëåäóþùèìè ïàðàìåòðàìè:
ìàêñèìóì èñïîëüçîâàííîé îïåðàòèâíîé ïàìÿòè êîòîðàÿ áóäåò çàäåéñòâîâàííà óñòàíàâëèâàåòñÿ â ðàçìåðå mem áàéò
ìàêñèìàëüíûé ðàçìåð ôàéëà ïîäêà÷êè ðàâåí swap áàéòàì
ôàéë ïîäêà÷êè ðàñïîëîæåí ïî îòíîñèòåëüíîìó èëè àáñîëþòíîìó àäðåñó çàïèñàíîìó â swap_path

Âîçâðàùàåìîå çíà÷åíèå: 1 - óñïåøíî âûïîëíåíà èíèöèàëèçàöèÿ.
0 - âîâðåìÿ èíèöèàëèçàöèè âîçíèêëè îøèáêè, êîä îøèáêè çàïèñàí â errno

Êîäû îøèáîê äëÿ errno
EALREADY - ïîâòîðíûé âûçîâ ma_init

ENOMEM - íåâîçìîæíî âûäåëèòü ìåñòî ïîä êó÷ó ðàçìåðîâ mem

EACCES - íåò ïðàâ äîñòóïà ê ôàéëó swap_path
EFAULT - àäðåñ swap_path íåäîñòóïåí
ENOSPC - ôàéë swap_path íåâîçìîæíî ñîçäàòü òàê êàê â ôàéëîâîé ñèñòåìå íåò ìåñòà
ENOTDIR - ÷àñòü ïóòè â swap_path, êîòîðàÿ äîëæíà áûëà áûòü ïàïêîé, îêàçàëàñü ìàìêîé)
EBUSY - ôàéë swap_path óæå çàíÿò
EFBIG - çàïðàøèâàåìûé ðàçìåð ôàéëà ïîäêà÷êè ñëèøêîì áîëüøîé

*/



void ma_deinit();
/*
ma_deinit çàâåðøàåò ðàáîòó àëëîêàòîðà ïàìÿòè, îñâîáîæäàÿ âñþ çàíÿòóþ ïàìÿòü, è óäàëÿÿ ôàéë ïîäêà÷êè.
*/



size_t ma_alloc(size_t sz);
/*
ma_alloc âûäàžò âíóòðåííèé èäåíòèôèêàòîð ó÷àñòêà ïàìÿòè äëèíîé sz áàéò.
Âàëèäíûå èíäåíòèôèêàòîðû îò 1 äî ìàêñèìàëüíîãî çíà÷åíèÿ size_t.
Ïðèñâîåíèå èíäåíòèôèêàòîðîâ ïðîèñõîäèò òàêèì îáðàçîì ÷òîáû êàæäûé âíîâü âûäåëåííûé èäåíòèôèêàòîð íå ñîâïàë íè ñ îäíèì ðàíåå âûäåëåíûì.
Â ñëó÷àå îøèáêè àëëîêàöèè âîçâðàùàåòñÿ 0, à êîä îøèáêè çàïèñûâàåòñÿ â errno

Êîäû îøèáîê
ENOMEM - â êó÷å íåäîñòàòî÷íî ïàìÿòè äëÿ âûäåëåíèÿ ó÷àñòêà ðàçìåðîì sz (swap - óæå_âûäåëåííàÿ_ïàìÿòü < sz)
E2BIG - çàïðàøèâàåìûé ó÷àñòîê ïàìÿòè íåâîçìîæíî áóäåò óìåñòèòü â îïåðàòèâíîé ïàìÿòè (mem < sz)
EMLINK - çàêîí÷èëèñü ñâîáîäíûå èäåíòèôèêàòîðû
*/


int ma_free(size_t id);
/*
Îñâîáîæäàåò ïàìÿòü çàíèìàåìóþ ó÷àñòêîì ñ âíóòðåííèì èäåíòèôèêàòîðîì id.

Âîçâðàùàåìîå çíà÷åíèå:
1 - óñïåøíî âûïîëíåíî.
0 - â êà÷åñòâå àðãóìåíòà èñïîëüçîâàí íå âàëèäíûé óêàçàòåëü. Â ýòîì ñëó÷àå errno ïðèñâàèâàåòñÿ êîä îøèáêè:

EFAULT - ïàìÿòü ñ òàêèì èäåíòèôèêàòîðîì åùž íå âûäåëåíà, èëè óæå îñâîáîæäåíà
*/



void* ma_get(size_t id);
/*
ma_get() âîçâðàùàåò óêàçàòåëü íà ó÷àñòîê ïàìÿòè ñ âíóòðåííèì èäåíòèôèêàòîðîì id.
Äî òåõ ïîð ïîêà â îòíîøåíèè òîãî æå èäåíòèôèêàòîðà íå áóäåò âûçâàíà ôóíêöèÿ ma_release() ãàðàíòèðóåòñÿ âàëèäíîñòü ýòîãî óêàçàòåëÿ(SAFEMODE).
Â ñëó÷àå îøèáêè âîçâðàùàåòñÿ NULL, à êîä îøèáêè çàïèñûâàåòñÿ â errno
Êîäû îøèáîê
EFAULT - ïàìÿòü ñ òàêèì èäåíòèôèêàòîðîì åùž íå âûäåëåíà, èëè óæå îñâîáîæäåíà
ENOMEM - íåäîñòàòî÷íî ìåñòà â îïåðàòèâíîé ïàìÿòè
ENOBUFS - ïàìÿòü ñëèøêîì ôðàãìåíòèðîâàíà

EBADF - îøèáêà ôàéëà ïîäêà÷êè
to be continued...
*/


int ma_release(size_t id);
/*
ma_release() óêàçûâàåò íà òî ÷òî ó÷àñòîê ïàìÿòè ñ èäåíòèôèêàòîðîì id áîëüøå íå áóäåò èñïîëüçîâàí è â ñëó÷àå íåîáõîäèìîñòè åãî ìîæíî ïåðåìåñòèòü â ôàéë ïîäêà÷êè.
Åñëè ïî ýòîìó id ðàíåå áûë âûäàí óêàçàòåëü ôóíêöèåé get(id), òî èçìåíåíèå ïàìÿòè ïî ýòîìó óêàçàòåëþ ìîæåò ïðèâåñòè ê ïîòåðÿì âíåñžííûõ èçìåíåíèé, ëèáî ïîð÷å êó÷è.

Âîçâðàùàåìîå çíà÷åíèå:
1 - óñïåøíî âûïîëíåíî.
0 - â êà÷åñòâå àðãóìåíòà èñïîëüçîâàí íå âàëèäíûé óêàçàòåëü. Â ýòîì ñëó÷àå errno ïðèñâàèâàåòñÿ êîä îøèáêè:

EFAULT - ïàìÿòü ñ òàêèì èäåíòèôèêàòîðîì åùž íå âûäåëåíà, èëè óæå îñâîáîæäåíà(ñ ïîìîùüþ ma_free() èëè ma_release()
*/


#endif	/* MEMALLOC_H */
